import { mutation } from "./_generated/server";
import { v } from "convex/values";

const images = [
  "/placeholders/1.jpg",
  "/placeholders/2.jpg",
  "/placeholders/3.jpg",
  "/placeholders/4.jpg",
  "/placeholders/5.jpg",
  "/placeholders/6.jpg",
  "/placeholders/7.jpg",
  "/placeholders/8.jpg",
  "/placeholders/9.jpg",
  "/placeholders/10.jpg",
];

/**
 * 创建新增数据api
 * @param {string } orgId 用户orgid
 * @param {string} title 标题
 */

export const create = mutation({
  args: {
    // mutation 所接受的参数
    orgId: v.string(),
    title: v.string(),
  },
  // ctx上下文对象，包含与当前请求相关的各种信息和功能，比如数据库访问、身份验证等
  // args调用 mutation 时传入的参数对象，这里会包含 orgId 和 title
  handler: async (ctx, args) => {
    // ctx上下文对象，包含与当前请求相关的各种信息和功能，比如数据库访问、身份验证等
    // args调用 mutation 时传入的参数对象，这里会包含 orgId 和 title
    const identity = await ctx.auth.getUserIdentity(); // 获取当前用户的身份信息
    if (!identity) {
      throw new Error("未经授权");
    }

    const randomImage = images[Math.floor(Math.random() * images.length)];

    const board = await ctx.db.insert("boards", {
      title: args.title,
      orgId: args.orgId,
      authorId: identity.subject,
      authorName: identity.name as string,
      imageUrl: randomImage,
    });

    return board;
  },
});

/**
 * 移除用户
 * @param {string} id 用户id
 */
export const remove = mutation({
  args: { id: v.id("boards") }, // 接受一个id，这个id必须在boards这张表里边的
  handler: async (ctx, args) => {
    const identity = await ctx.auth.getUserIdentity();

    if (!identity) throw new Error("未经授权");

    const userId = identity.subject;

    // 检查是否有收藏
    const existingFavorite = await ctx.db
      .query("userFavorites")
      .withIndex("by_user_board", (q) =>
        q.eq("userId", userId).eq("boardId", args.id)
      )
      .unique();

    if (existingFavorite) {
      await ctx.db.delete(existingFavorite._id);
    }

    await ctx.db.delete(args.id);
  },
});

/**
 * 更新用户信息
 * @param {string} id 用户id
 * @param {string} title 标题
 */
export const update = mutation({
  args: { id: v.id("boards"), title: v.string() },
  handler: async (ctx, args) => {
    const identity = await ctx.auth.getUserIdentity();

    if (!identity) throw new Error("未经授权");

    const title = args.title.trim();

    if (!title) throw new Error("title必填");

    if (title.length > 60) throw new Error("title长度不能超过60");

    const board = await ctx.db.patch(args.id, {
      title,
    });

    return board;
  },
});

/**
 * 收藏
 *
 * @param {Object} args - 查询参数。
 * @param {string} args.orgId - 组织id。
 * @param {string} args.id - 用户id。
 * @return {Primise<Object>} 返回包含被收藏的 board 对象
 */
export const favorite = mutation({
  args: { id: v.id("boards"), orgId: v.string() },
  handler: async (ctx, args) => {
    const identity = await ctx.auth.getUserIdentity();

    if (!identity) throw new Error("未经授权");

    const board = await ctx.db.get(args.id);

    if (!board) throw new Error("没有查询到任何数据");

    const userId = identity.subject;

    // 查询是否有收藏
    const existingFavorite = await ctx.db
      .query("userFavorites")
      .withIndex("by_user_board_org", (q) => {
        return q
          .eq("userId", userId)
          .eq("boardId", board._id)
          .eq("orgId", args.orgId);
      })
      .unique();

    if (existingFavorite) throw new Error("用户已经收藏了这个项目");

    // 没有就插入
    await ctx.db.insert("userFavorites", {
      orgId: args.orgId,
      userId,
      boardId: board._id,
    });

    return board;
  },
});

/**
 * 取消收藏
 */
export const unFavorite = mutation({
  args: { id: v.id("boards") },
  handler: async (ctx, args) => {
    const identity = await ctx.auth.getUserIdentity();

    if (!identity) throw new Error("未经授权");

    const board = await ctx.db.get(args.id);

    if (!board) throw new Error("没有查询到任何数据");

    const userId = identity.subject;

    // 查询是否有收藏
    const existingFavorite = await ctx.db
      .query("userFavorites")
      .withIndex("by_user_board", (q) => {
        return q.eq("userId", userId).eq("boardId", board._id); // TODO: 检查是否需要orgId;
      })
      .unique();

    if (!existingFavorite) throw new Error("用户还没有收藏这个项目");

    // 有的话就删除这个收藏
    await ctx.db.delete(existingFavorite._id);

    return board;
  },
});
